package com.reflect4;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class MyReflectDemo {
    public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, IllegalAccessException {
        /**
         * Class类中用于获取成员方法的方法
         *     Method[] getMethods():返回所有公共成员方法对象的数组，包括继承
         *     Method[] getDeclaredmethods():返回所有成员方法对象的数组，不包括继承
         *     Method[] getMethod(String name,Class<?>...parameterTypes):返回单个公共成员方法对象
         *     Method[] getDeclaredMethod(String name,Class<?>...parameterTypes):返回单个成员方法对象
         *
         *
         *     Method类中用于创建对象的方法
         *         Object invoke(Object obj,Object...args):运行方法
         *         参数一：用obj对象调用该方法
         *         参数二：调用方法的传递的参数（如果没有就不写）
         *         返回值：方法的返回值（如果没有就不写）
         */


        //1.获取class字节码文件对象
        Class clazz = Class.forName("com.reflect4.Student");


        //2.获取里面所有的方法对象(包含父类中所有的公共方法)
        /*Method[] methods = clazz.getMethods();
        for (Method method : methods) {
            System.out.println(method);
        }*/

        //获取里面所有的方法对象（不能获取父类的，但是可以获取本类中私有的方法）
        /*Method[] methods = clazz.getDeclaredMethods();
        for (Method method : methods) {
            System.out.println(method);
        }*/

        //获取指定的单一方法
        Method method = clazz.getDeclaredMethod("eat", String.class);
        System.out.println(method);

        // 获取方法的修饰符
        int modifiers = method.getModifiers();
        System.out.println(modifiers);

        // 获取方法的名字
        String name = method.getName();
        System.out.println(name);

        // 获取方法的返回值
        Class type = method.getReturnType();
        System.out.println(type);

        // 获取方法的形参
        Class<?>[] parameterTypes = method.getParameterTypes();
        for (Class<?> parameterType : parameterTypes) {
            System.out.println(parameterType);
        }

        // 获取方法的异常处理
        Class<?>[] exceptionTypes = method.getExceptionTypes();
        System.out.println(exceptionTypes);

        //方法运行
        //Method类中用于创建对象的方法
        //         *         Object invoke(Object obj,Object...args):运行方法
        //         *         参数一：用obj对象调用该方法
        //         *         参数二：调用方法的传递的参数（如果没有就不写）
        //         *         返回值：方法的返回值（如果没有就不写）

        Student s = new Student();
        method.setAccessible(true);
        //参数一s：     表示方法的调用者
        //参数二汉堡包： 表示在调用方法的时候传递的实际参数
        Object result = method.invoke(s, "汉堡包");
        System.out.println(result);

    }


}
